package com.bawei.lib_common.livedata_eventbus

import androidx.lifecycle.Observer
import java.util.concurrent.atomic.AtomicBoolean

/**
 * @author yaotianxue
 * @description 对Observer的再次封装约束，observer.onChanged(event.data)，使用CAS比较交换判断是否数据回调
 * @date 2025/5/28
 */
class EventObserver<T>(
    private val observer: Observer<T>,
    private val isSticky: Boolean // 是否粘性模式
) : Observer<Event<T>> {
    // 标记是否已消费（仅非粘性事件需要）
    private val consumed = AtomicBoolean(false)

    override fun onChanged(event: Event<T>) {
        when (event) {
            is Event.Sticky -> {
                if (isSticky) {
                    observer.onChanged(event.data)
                }
            }
            is Event.Normal -> {
                // 非粘性事件：确保只消费一次
                if (!isSticky && consumed.compareAndSet(false, true)) {
                    observer.onChanged(event.data)
                }
            }
        }
    }
}